home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Source / GNU / cc / rtf2ascii.c < prev    next >
Text File  |  1994-01-04  |  3KB  |  88 lines

  1.  
  2. // rtf2ascii.c
  3.  
  4. #import <libc.h>
  5. #import <stdio.h>
  6. #import <ctype.h>
  7. #import <string.h>
  8.  
  9. #define ASCII_TERMINATOR '\0' 
  10.  
  11. const char * rtfToAscii( const char *rtfTextPtr, int rtfTextLen, int * asciiTextLen ) 
  12. {
  13.    char * asciiTextBuf = (char *) malloc(rtfTextLen);  // should be plenty
  14.    char * asciiTextPtr = asciiTextBuf;
  15.    const char *endRtfPtr = rtfTextPtr + rtfTextLen;
  16.  
  17.    if (!asciiTextBuf) // just in case
  18.       return NULL;
  19.       
  20.    while ( rtfTextPtr != endRtfPtr ) {
  21.       switch( *rtfTextPtr ) {
  22.        case '\n':
  23.           rtfTextPtr++;
  24.           break;
  25.        case '}':
  26.           if ( *++rtfTextPtr == '\n' ) {
  27.          rtfTextPtr++;
  28.          if (*rtfTextPtr == '‹') rtfTextPtr++;
  29.       }         
  30.           break;
  31.        case '{':
  32.           if ( !strncmp( rtfTextPtr, "{\\stylesheet", 12 ) 
  33.         || !strncmp( rtfTextPtr, "{\\fonttbl", 9 ) 
  34.         || !strncmp( rtfTextPtr, "{\\colortbl", 10 ) 
  35.         || !strncmp( rtfTextPtr, "{\\NeXTHelp", 10 )
  36.         || !strncmp( rtfTextPtr, "{{\\NeXTHelp", 11 ) ) {
  37.              int depth = 1;
  38.              while ( depth > 0 ) {
  39.                 switch ( *++rtfTextPtr ) {
  40.                  case '{': depth++; break;
  41.                  case '}': depth--; break;
  42.                 }
  43.              }
  44.           }
  45.           else
  46.              rtfTextPtr++;
  47.           break;
  48.        case '\\':
  49.           rtfTextPtr++;
  50.           if (*rtfTextPtr == '{'  
  51.        || *rtfTextPtr == '}'  
  52.        ||  *rtfTextPtr == '\\'  
  53.        ||  *rtfTextPtr == '\n' ) {
  54.              *asciiTextPtr++ = *rtfTextPtr++;
  55.           } else if ( *rtfTextPtr == '\'' ) {
  56.              int v1, v2, value;
  57.              rtfTextPtr++;
  58.              v1 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0') 
  59.                                      : ((*rtfTextPtr - 'a') + 10);
  60.              rtfTextPtr++;
  61.              v2 = isdigit( *rtfTextPtr ) ? (*rtfTextPtr - '0') 
  62.                                      : ((*rtfTextPtr - 'a') + 10);
  63.              value = (v1 << 4) | (v2);
  64.              *asciiTextPtr++ = value;
  65.              rtfTextPtr++;
  66.           } else {
  67.              while ( isalpha( *rtfTextPtr ) ) rtfTextPtr++;
  68.          if (*rtfTextPtr == '-') rtfTextPtr++;
  69.          while ( isdigit( *rtfTextPtr ) ) rtfTextPtr++;
  70.          if ( *rtfTextPtr == ' ' ) rtfTextPtr++;
  71.          else while (*rtfTextPtr == ' ') rtfTextPtr++;
  72.           }
  73.           break;
  74.         default:
  75.           *asciiTextPtr++ = *rtfTextPtr++;
  76.        }       
  77.    }
  78.    *asciiTextPtr = ASCII_TERMINATOR;
  79.    *asciiTextLen = (int)asciiTextPtr - (int)asciiTextBuf;
  80. #ifdef DEBUG
  81.    printf("Converting RTF buffer of size %d to ASCII buffer of size %d.\n",
  82.       rtfTextLen, *asciiTextLen);
  83. #endif
  84.    return asciiTextBuf;
  85. }
  86.  
  87.  
  88.